Python 函数声明先后顺序的问题!

您所在的位置:网站首页 python class与def Python 函数声明先后顺序的问题!

Python 函数声明先后顺序的问题!

2024-01-23 16:54| 来源: 网络整理| 查看: 265

在 Python 中如果把函数定义写在调用的下方可能会出错,例如下面的代码

foo() def foo(): print("hello")

执行时会报出错误

Python资源共享群:484031800

NameError: name 'foo' is not defined

这时候要把 foo() 调用代码放到该函数的声明后面

def foo(): print("hello") foo()

这样执行就一切正常了。这仿佛像是 C 语言中的函数调用需要提前声明一般,例如在 C 语言中要调用后头的定义的函数要写成

void foo(); int main() { foo(); } void foo() { printf("Hello"); }

实际上 Python 中并不存在函数提前声明一说,也不能像 Java 那样函数可以写在任意位置,因为 Java 是编译型的语言,Python 是解释型的。

而且也不是一定要求被调用的函数一定要在源代码层面上定义在调用者前方。

Python 中函数声明的顺序据我理解有两条规则

Python 源代码是由上往下解析的找到程序入口(未包含在函数中的代码) 即开始执行,执行到的函数未被先行解释到即报错

分析下面两段代码

def foo(): bar() if __name__ == '__main__': foo() def bar(): print("hello")

Python 从第 1 行一直解析到第 4 行的入口,进而往回跳,调用到第 1 行的 foo() 函数,而其中的 bar() 函数还未及被解析到,所以会提示

NameError: name 'bar' is not define

如果把程序入口往后调

def foo(): bar() def bar(): print("hello") if __name__ == '__main__': foo()

上面代码执行无误,输出

hello

foo() 调用的 bar() 不也是在它下方声明的吗?所以这一点与 C 是有区别的。

这时候的理解是这样的,Python 从第 1 行自上往下解析到第 7 行的程序入口时,foo() 并未实际调用 bar(),但 foo() 和 bar() 函数都已解析到了,所以回过头来 foo() 与 bar() 之间怎么调用都无妨。

因此, 最好的实践方法就是把程序的入口放到代码的最下方,那么它前面的函数不管如何的声明顺序都没有关系 。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3